package com.yiboshi.rehrs;

import cn.hutool.core.io.FileUtil;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class HexToCharConverter {

    /**
     * 递归遍历文件夹中的所有 .js 文件，并将其中的 \xHH 格式的十六进制数转换为正常字符。
     *
     * @param inputDirPath  输入文件夹路径
     * @param outputDirPath 输出文件夹路径
     * @throws IOException 如果文件读写失败
     */
    public static void convertHexInDirectory(String inputDirPath, String outputDirPath) throws IOException {
        File inputDir = new File(inputDirPath);
        if (!inputDir.exists() || !inputDir.isDirectory()) {
            throw new IllegalArgumentException("输入路径不是有效的文件夹: " + inputDirPath);
        }

        // 创建输出文件夹（如果不存在）
        File outputDir = new File(outputDirPath);
        if (!outputDir.exists()) {
            outputDir.mkdirs();
        }

        // 遍历文件夹
        processDirectory(inputDir, outputDir);
    }

    /**
     * 处理单个文件夹及其子文件夹。
     *
     * @param currentInputDir 当前输入文件夹
     * @param currentOutputDir 当前输出文件夹
     * @throws IOException 如果文件读写失败
     */
    private static void processDirectory(File currentInputDir, File currentOutputDir) throws IOException {
        File[] files = currentInputDir.listFiles();
        if (files == null) return;

        for (File file : files) {
            if (file.isDirectory()) {
                // 如果是文件夹，递归处理
                File newOutputDir = new File(currentOutputDir, file.getName());
                if (!newOutputDir.exists()) {
                    newOutputDir.mkdirs();
                }
                processDirectory(file, newOutputDir);
            } else if (file.getName().endsWith(".js")) {
                // 如果是 .js 文件，进行解码
                File outputFile = new File(currentOutputDir, file.getName().replace(".js", "-decode.js"));
                convertHexInFile(file.getAbsolutePath(), outputFile.getAbsolutePath());
            }
        }
    }

    /**
     * 将文件中的所有两位十六进制数（如 \x65）转换为正常字符。
     *
     * @param inputFilePath  输入文件路径
     * @param outputFilePath 输出文件路径
     * @throws IOException 如果文件读写失败
     */
    public static void convertHexInFile(String inputFilePath, String outputFilePath) throws IOException {
        // 正则表达式匹配两位十六进制数（格式：\xHH）
        Pattern hexPattern = Pattern.compile("\\\\x([0-9a-fA-F]{2})");

        // 读取输入文件内容
        StringBuilder content = new StringBuilder();
        try (BufferedReader reader = new BufferedReader(new FileReader(inputFilePath))) {
            String line;
            while ((line = reader.readLine()) != null) {
                content.append(line).append(System.lineSeparator());
            }
        }

        // 替换所有的 \xHH 格式的十六进制数为对应的字符

        String result = HexToStringConverter.convertHexToChars(content.toString());

        // 将结果写入输出文件
        try (BufferedWriter writer = new BufferedWriter(new FileWriter(outputFilePath))) {
            writer.write(result);
        }
    }

    /**
     * 使用正则表达式替换字符串中的所有 \xHH 格式的十六进制数为对应的字符。
     *
     * @param input       输入字符串
     * @param hexPattern  匹配两位十六进制数的正则表达式
     * @return 替换后的字符串
     */
    private static String replaceHexWithChar(String input, Pattern hexPattern) {
        Matcher matcher = hexPattern.matcher(input);
        StringBuffer result = new StringBuffer();

        while (matcher.find()) {
            // 获取匹配到的十六进制值
            String hexValue = matcher.group(1);
            // 转换为十进制整数值
            int decimalValue = Integer.parseInt(hexValue, 16);
            // 转换为对应的字符
            char character = (char) decimalValue;
            // 替换匹配的部分为对应的字符
            matcher.appendReplacement(result, Character.toString(character));
        }
        matcher.appendTail(result);

        return result.toString();
    }

    public static void main(String[] args) {
        String inputDirPath = "C:\\Users\\472464220\\Desktop\\xiaofeixia\\美味\\origin";   // 输入文件夹路径
        String outputDirPath = "C:\\Users\\472464220\\Desktop\\xiaofeixia\\美味\\decode"; // 输出文件夹路径

        try {
            convertHexInDirectory(inputDirPath, outputDirPath);
            System.out.println("转换完成！结果已保存到：" + outputDirPath);
        } catch (IOException e) {
            System.err.println("文件处理失败：" + e.getMessage());
        }
    }

    public static void main2(String[] args){
        String outputDirPath = "C:\\Users\\472464220\\Desktop\\xiaofeixia\\美味\\decode\\decode"; // 输出文件夹路径
        File outputDir = new File(outputDirPath);
        FileUtil.del(outputDirPath);
    }
}